//  集体视频去掉第一帧

import path from 'node:path';
import fs from 'node:fs/promises';
import { fileURLToPath } from 'node:url';
import ffmpeg from 'fluent-ffmpeg';
import { exec } from 'node:child_process';
import { promisify } from 'node:util';

const execAsync = promisify(exec);

//  视频去掉第一帧

// 配置参数
const config = {
    // 输入文件夹数组（示例值，使用时请修改）
    inputFolders: [
        String.raw`\\10.1.1.5\video\S儿歌智玩S\小猪佩奇 国语版\Season 03`,
        String.raw`\\10.1.1.5\video\S儿歌智玩S\小猪佩奇 国语版\Season 04`,
        String.raw`\\10.1.1.5\video\S儿歌智玩S\小猪佩奇 国语版\Season 05`,
        String.raw`\\10.1.1.5\video\S儿歌智玩S\小猪佩奇 国语版\Season 06`,
        String.raw`\\10.1.1.5\video\S儿歌智玩S\小猪佩奇 国语版\Season 07`,
        String.raw`\\10.1.1.5\video\S儿歌智玩S\小猪佩奇 国语版\Season 08`,
        String.raw`\\10.1.1.5\video\S儿歌智玩S\小猪佩奇 国语版\Season 09`,
        String.raw`\\10.1.1.5\video\S儿歌智玩S\小猪佩奇 国语版\Season 10`
    ],
    // 输出根目录（示例值，使用时请修改）
    outputRoot: String.raw`E:\out`,
    // 是否跳过第一帧（默认true）
    skipFirstFrame: true,
    // FFmpeg NVENC编码参数（可根据需要调整）
    encoderOptions: {
        codec: 'hevc_nvenc',
        // Pascal 架构（Tesla P4）推荐参数
        outputOptions: [
            '-c:v hevc_nvenc', // 显式指定编码器
            '-preset p4', // Tesla P4 建议用 p4（平衡模式）
            '-profile:v main', // 兼容性最好的 Profile
            '-rc vbr', // 可变码率模式
            '-cq 21', // 质量级别（18-28，值越小质量越高）
            '-qmin 0', // 最小量化值（0=自动）
            '-qmax 99', // 最大量化值
            '-b_ref_mode middle', // B帧参考模式
            '-movflags +faststart', // 流媒体快速播放
            '-spatial_aq 1', // 空间自适应量化（提高画质）
            '-temporal_aq 1', // 时间自适应量化
            '-weighted_pred 1', // 加权预测（提高动态场景质量）
            '-pix_fmt p010le' // 10位色深（Tesla P4 支持）
        ] // 10位色深（Tesla P4 支持）
    }
};

// 主处理函数
async function processVideos() {
    try {
        // 验证FFmpeg是否支持hevc_nvenc
        await verifyNvencSupport();

        // 遍历所有输入文件夹
        for (const inputFolder of config.inputFolders) {
            // 获取最后一个文件夹名
            const lastDirName = path.basename(inputFolder);
            // 创建对应的输出文件夹
            const outputFolder = path.join(config.outputRoot, lastDirName);
            await fs.mkdir(outputFolder, { recursive: true });

            // 读取当前文件夹下的MP4文件（非递归）
            const files = await fs.readdir(inputFolder);
            const mp4Files = files.filter(file => file.toLowerCase().endsWith('.mp4'));

            // 处理每个MP4文件
            for (const file of mp4Files) {
                const inputPath = path.join(inputFolder, file);
                const outputPath = path.join(outputFolder, file);

                console.log(`Processing: ${inputPath}`);
                await convertVideo(inputPath, outputPath);
            }
        }

        console.log('All videos processed successfully!');
    } catch (error) {
        console.error('Error processing videos:', error);
    }
}

// 视频转换函数
async function convertVideo(inputPath, outputPath) {
    return new Promise((resolve, reject) => {
        const command = ffmpeg(inputPath);

        // 只需要使用 outputOptions 传递所有参数
        command.outputOptions([
            // 基本参数
            '-c:v hevc_nvenc'
        ]);

        // 如果需要跳过第一帧
        if (config.skipFirstFrame) {
            command.seekInput(0.1); // 跳过前0.1秒
        }

        command
            .on('start', commandLine => {
                console.log('Running FFmpeg command:', commandLine);
            })
            .on('end', () => {
                console.log(`Finished processing: ${outputPath}`);
                resolve();
            })
            .on('error', err => {
                console.error(`Error processing ${inputPath}:`, err);
                reject(err);
            })
            .save(outputPath);
    });
}

// 验证hevc_nvenc支持
async function verifyNvencSupport() {
    try {
        const { stdout } = await execAsync('ffmpeg -codecs');
        if (!stdout.includes('hevc_nvenc')) {
            throw new Error('hevc_nvenc encoder not available in FFmpeg');
        }
        console.log('hevc_nvenc encoder is available');
    } catch (error) {
        throw new Error('Failed to verify hevc_nvenc support. Make sure FFmpeg with NVENC support is installed.');
    }
}

// 获取当前模块路径
const __dirname = path.dirname(fileURLToPath(import.meta.url));

// 启动处理
processVideos();
